home *** CD-ROM | disk | FTP | other *** search
/ Euroscene 2 / Euroscene 2.iso / USEFUL / HippoPlayer / Support / Examplescope.s next >
Text File  |  1995-10-12  |  12KB  |  602 lines

  1. *******************************************************************************
  2. *                         Example scope for HippoPlayer
  3. *                            By K-P Koljonen
  4. *******************************************************************************
  5. * Can be assembled with Asm-One v1.25, at least. 
  6. * Works on all Amiga configurations!
  7.  
  8. * Version 1.1: Considered sample length to be bytes when it actually was in
  9. *              words.
  10.  
  11.  
  12. *** Includes:
  13.  
  14.      incdir    include:
  15.     include    exec/exec_lib.i
  16.     include    exec/ports.i
  17.     include    exec/types.i
  18.     include    graphics/graphics_lib.i
  19.     include    graphics/rastport.i
  20.     include    intuition/intuition_lib.i
  21.     include    intuition/intuition.i
  22.     incdir
  23.  
  24. *** Some useful macros
  25.  
  26. lob    macro
  27.     jsr    _LVO\1(a6)
  28.     endm
  29.  
  30. lore    macro
  31.     ifc    "\1","Exec"
  32.     ifd    _ExecBase
  33.     ifeq    _ExecBase
  34.     move.l    (a5),a6
  35.     else
  36.     move.l    _ExecBase(a5),a6
  37.     endc
  38.     else
  39.     move.l    4.w,a6
  40.     endc
  41.     else
  42.     move.l    _\1Base(a5),a6
  43.     endc
  44.     jsr    _LVO\2(a6)
  45.     endm
  46.  
  47. pushm    macro
  48.     ifc    "\1","all"
  49.     movem.l    d0-a6,-(sp)
  50.     else
  51.     movem.l    \1,-(sp)
  52.     endc
  53.     endm
  54.  
  55. popm    macro
  56.     ifc    "\1","all"
  57.     movem.l    (sp)+,d0-a6
  58.     else
  59.     movem.l    (sp)+,\1
  60.     endc
  61.     endm
  62.  
  63. push    macro
  64.     move.l    \1,-(sp)
  65.     endm
  66.  
  67. pop    macro
  68.     move.l    (sp)+,\1
  69.     endm
  70.  
  71.  
  72.  
  73. *** HippoPlayer's port:
  74.  
  75.     STRUCTURE    HippoPort,MP_SIZE
  76.     LONG        hip_private1    * Private..
  77.     APTR        hip_kplbase    * kplbase address
  78.     WORD        hip_reserved0    * Private..
  79.     BYTE        hip_reserved1    * Private..
  80.     BYTE        hip_opencount    * Open count
  81.     BYTE        hip_mainvolume    * Main volume, 0-64
  82.     BYTE        hip_play    * If non-zero, HiP is playing
  83.     BYTE        hip_playertype     * 33 = Protracker, 49 = PS3M. 
  84.     *** Protracker ***
  85.     BYTE        hip_reserved2
  86.     APTR        hip_PTch1    * Protracker channel data for ch1
  87.     APTR        hip_PTch2    * ch2
  88.     APTR        hip_PTch3    * ch3
  89.     APTR        hip_PTch4    * ch4
  90.     *** PS3M ***
  91.     APTR        hip_ps3mleft    * Buffer for the left side
  92.     APTR        hip_ps3mright    * Buffer for the right side
  93.     LONG        hip_ps3moffs    * Playing position
  94.     LONG        hip_ps3mmaxoffs    * Max value for hip_ps3moffs
  95.  
  96.     BYTE        hip_PTtrigger1
  97.     BYTE        hip_PTtrigger2
  98.     BYTE        hip_PTtrigger3
  99.     BYTE        hip_PTtrigger4
  100.  
  101.     LABEL        HippoPort_SIZEOF 
  102.  
  103.     *** PT channel data block
  104.     STRUCTURE    PTch,0
  105.     LONG        PTch_start    * Start address of sample
  106.     WORD        PTch_length    * Length of sample in words
  107.     LONG        PTch_loopstart    * Start address of loop
  108.     WORD        PTch_replen    * Loop length in words
  109.     WORD        PTch_volume    * Channel volume
  110.     WORD        PTch_period    * Channel period
  111.     WORD        PTch_private1    * Private...
  112.  
  113. *** Dimensions:
  114.  
  115. WIDTH    =    320    
  116. HEIGHT    =    64
  117.  
  118. *** Variables:
  119.  
  120.     rsreset
  121. _ExecBase    rs.l    1
  122. _GFXBase    rs.l    1
  123. _IntuiBase    rs.l    1
  124. port        rs.l    1
  125. owntask        rs.l    1
  126. screenlock    rs.l    1
  127. oldpri        rs.l    1
  128. windowbase    rs.l    1
  129. rastport    rs.l    1
  130. userport    rs.l    1
  131. windowtop    rs    1
  132. windowright    rs    1
  133. windowleft    rs    1
  134. windowbottom    rs    1
  135. draw1        rs.l    1
  136. draw2        rs.l    1
  137. omabitmap    rs.b    bm_SIZEOF
  138. size_var    rs.b    0
  139.  
  140. *** Main program
  141.  
  142. main    lea    var_b,a5        * Store execbase
  143.     move.l    4.w,a6
  144.     move.l    a6,(a5)
  145.     
  146.     sub.l    a1,a1            * Find our process
  147.     lob    FindTask
  148.     move.l    d0,owntask(a5)
  149.  
  150.     lea    intuiname(pc),a1    * Open libs
  151.     lore    Exec,OldOpenLibrary
  152.     move.l    d0,_IntuiBase(a5)
  153.  
  154.     lea     gfxname(pc),a1        
  155.     lob    OldOpenLibrary
  156.     move.l    d0,_GFXBase(a5)
  157.  
  158. *** Try to find HippoPlayer's port. If succesful, add 1 to hip_opencount
  159. *** indicating we are using the information in the port.
  160. *** Protect this procedure with Forbid()-Permit()!
  161.  
  162.     lob    Forbid
  163.     lea    portname(pc),a1
  164.     lob    FindPort
  165.     move.l    d0,port(a5)
  166.     beq.w    exit
  167.     move.l    d0,a0
  168.     addq.b    #1,hip_opencount(a0)    * We are using the port now!
  169.     lob    Permit
  170.  
  171. *** Get some info about the screen we're running on
  172.  
  173.     bsr.w    getscreendata
  174.  
  175. *** Open our window
  176.  
  177.     lea    winstruc,a0
  178.     lore    Intui,OpenWindow
  179.     move.l    d0,windowbase(a5)
  180.     beq.w    exit
  181.     move.l    d0,a0
  182.     move.l    wd_RPort(a0),rastport(a5)    * Store rastport and userport
  183.     move.l    wd_UserPort(a0),userport(a5)
  184.  
  185. *** Draw a bevel box
  186.  
  187. plx1    equr    d4
  188. plx2    equr    d5
  189. ply1    equr    d6
  190. ply2    equr    d7
  191.  
  192.     moveq   #8,plx1
  193.     move    #331,plx2
  194.     moveq   #13,ply1
  195.     moveq   #80,ply2
  196.     add    windowleft(a5),plx1
  197.     add    windowleft(a5),plx2
  198.     add    windowtop(a5),ply1
  199.     add    windowtop(a5),ply2
  200.     move.l    rastport(a5),a2
  201.     bsr.w    piirra_loota2
  202.     subq    #1,plx1
  203.     addq    #1,plx2
  204.     bsr.w    piirra_loota2a
  205.  
  206. *** Initialize the bitmap structure
  207.  
  208.     lea    omabitmap(a5),a0
  209.     moveq    #1,d0            * depth (1 bitplane)
  210.     move    #WIDTH,d1        * width
  211.     move    #HEIGHT,d2        * height 
  212.     lore    GFX,InitBitMap
  213.     move.l    #buffer1,omabitmap+bm_Planes(a5) * Plane pointer
  214.  
  215.     move.l    #buffer1,draw1(a5)    * Buffer pointers for drawing
  216.     move.l    #buffer2,draw2(a5)
  217.  
  218. *** Set task priority to -30 to prevent messing up with other programs
  219.  
  220.     move.l    owntask(a5),a1        
  221.     moveq    #-30,d0
  222.     lore    Exec,SetTaskPri
  223.     move.l    d0,oldpri(a5)        * Store the old priority
  224.  
  225. *** Main loop begins here
  226.  
  227. loop    move.l    _GFXBase(a5),a6        * Wait a while..
  228.     lob    WaitTOF
  229.  
  230.     move.l    port(a5),a0        * Check if HiP is playing
  231.     tst.b    hip_play(a0)
  232.     beq.b    .oh
  233.     bsr.w    dung            * Do the scope
  234. .oh
  235.     move.l    userport(a5),a0        * Get messages from IDCMP
  236.     lore    Exec,GetMsg
  237.     tst.l    d0
  238.     beq.b    loop
  239.     move.l    d0,a1
  240.  
  241.     move.l    im_Class(a1),d2        
  242.     lob    ReplyMsg
  243.     cmp.l    #IDCMP_CLOSEWINDOW,d2    * Should we exit?
  244.     bne.b    loop            * No. Keep loopin'
  245.     
  246.     move.l    owntask(a5),a1        * Restore the old priority
  247.     move.l    oldpri(a5),d0
  248.     lore    Exec,SetTaskPri
  249.  
  250. exit
  251.  
  252. *** Exit program
  253.     
  254.     move.l    port(a5),d0        * IMPORTANT! Subtract 1 from
  255.     beq.b    .uh0            * hip_opencount when the port is not
  256.     move.l    d0,a0            * needed anymore!
  257.     subq.b    #1,hip_opencount(a0)
  258. .uh0
  259.  
  260.     move.l    windowbase(a5),d0    * Close the window
  261.     beq.b    .uh1
  262.     move.l    d0,a0
  263.     lore    Intui,CloseWindow
  264. .uh1
  265.     move.l    _IntuiBase(a5),a1    * And the libs
  266.     lore    Exec,CloseLibrary
  267.     move.l    _GFXBase(a5),a1
  268.     lob    CloseLibrary
  269.  
  270.     moveq    #0,d0            * No error
  271.     rts
  272.     
  273. ***** Get some info about the screen we're running on
  274.  
  275. getscreendata
  276.     move.l    (a5),a0            * Running kick2.0 or newer?
  277.     cmp    #37,LIB_VERSION(a0)
  278.     bhs.b    .new        
  279.     rts                
  280. .new                    * Yes.
  281.     
  282.     sub.l    a0,a0            * Default public screen
  283.     lore    Intui,LockPubScreen      * Kick2.0+ function
  284.     move.l    d0,d7
  285.     beq.b    exit
  286.  
  287.     move.l    d0,a0            * Store the values
  288.     move.b    sc_BarHeight(a0),windowtop+1(a5) 
  289.     move.b    sc_WBorLeft(a0),windowleft+1(a5)
  290.     move.b    sc_WBorRight(a0),windowright+1(a5)
  291.     move.b    sc_WBorBottom(a0),windowbottom+1(a5)
  292.     subq    #4,windowleft(a5)
  293.     subq    #4,windowright(a5)
  294.     subq    #2,windowbottom(a5)
  295.     sub    #10,windowtop(a5)
  296.     bpl.b    .olde
  297.     clr    windowtop(a5)
  298. .olde
  299.     move    windowtop(a5),d0    * Adjust the window size
  300.     add    d0,winstruc+nw_Height
  301.     move    windowleft(a5),d1
  302.     add    d1,winstruc+nw_Width
  303.     move    windowbottom(a5),d3
  304.     add    d3,winstruc+nw_Height
  305.  
  306.     move.l    d7,a1            * Unlock it. Let's hope it doesn't
  307.     sub.l    a0,a0            * go anywhere before we open our
  308.     lob    UnlockPubScreen        * window ;-)
  309.     rts
  310.  
  311.  
  312. *** Draw a bevel box
  313.  
  314. piirra_loota2a
  315.     pushm    all
  316.     moveq    #1,d3
  317.     bra.b    prl
  318.  
  319. piirra_loota2
  320.     pushm    all
  321.     moveq    #0,d3
  322. prl
  323.     move.l    rastport(a5),a2
  324.     move    #1,a3
  325.     move    #2,a4
  326.  
  327.     move.l    _GFXBase(a5),a6
  328.     move.l    a3,d0
  329.     move.l    a2,a1
  330.     lob    SetAPen
  331.  
  332.     move.l    plx1,d0
  333.     move.l    ply2,d1
  334.     lob    Move
  335.     move.l    a2,a1
  336.     move.l    plx1,d0
  337.     move.l    ply1,d1
  338.     lob    Draw
  339.  
  340.     move.l    a2,a1
  341.     move.l    plx2,d0
  342.     move.l    ply1,d1
  343.     lob    Draw
  344.  
  345.     move.l    a2,a1
  346.     move.l    a4,d0
  347.     lob    SetAPen
  348.  
  349.     move.l    a2,a1
  350.     move.l    plx2,d0
  351.     move.l    ply1,d1
  352.     addq.l    #1,d1
  353.     sub.l    d3,d1
  354.     lob    Move
  355.     move.l    a2,a1
  356.     move.l    plx2,d0
  357.     move.l    ply2,d1
  358.     lob    Draw
  359.  
  360.     move.l    a2,a1
  361.     move.l    plx1,d0
  362.     addq.l    #1,d0
  363.     move.l    ply2,d1
  364.     lob    Draw
  365.  
  366.     move.l    a2,a1
  367.     moveq    #1,d0
  368.     lob    SetAPen
  369.  
  370.     popm    all
  371.     rts
  372.  
  373.  
  374.  
  375. *** Display the scope
  376.  
  377. * I have two buffers, one for drawing and one for clearing.
  378. * Clearing is done with blitter during which cpu draws into the other
  379. * buffer. The drawn buffer is then dumped into the window using
  380. * BltBitMapRastPort().  If someone knows a faster way for doing this please
  381. * tell me.
  382.  
  383. dung
  384.     move.l    _GFXBase(a5),a6        * Grab the blitter
  385.     lob    OwnBlitter
  386.     lob    WaitBlit
  387.  
  388.     move.l    draw2(a5),$dff054    * Clear the drawing area
  389.     move    #0,$dff066
  390.     move.l    #$01000000,$dff040
  391.     move    #HEIGHT*64+WIDTH/16,$dff058
  392.  
  393.     lob    DisownBlitter        * Free the blitter
  394.  
  395.     pushm    all
  396.     move.l    port(a5),a0
  397.     cmp.b    #33,hip_playertype(a0)    * Protracker?
  398.     beq.b    .1
  399.     cmp.b    #49,hip_playertype(a0)    * PS3M?
  400.     beq.b    .2
  401.     bra.b    .3
  402. .1    bsr.b    quadrascope        * Quadrascope for PT
  403.     bra.b    .3
  404. .2    bsr.w    multiscope        * Stereoscope for PS3M
  405. .3    popm    all
  406.  
  407.     movem.l    draw1(a5),d0/d1        * Switch the buffers
  408.     exg    d0,d1
  409.     movem.l    d0/d1,draw1(a5)
  410.  
  411.     lea    omabitmap(a5),a0    * Set the bitplane pointer
  412.     move.l    d1,bm_Planes(a0)
  413.  
  414. ;    lea    omabitmap(a5),a0    * Copy from bitmap to rastport
  415.     move.l    rastport(a5),a1
  416.     moveq    #0,d0        * source x,y
  417.     moveq    #0,d1
  418.     moveq    #10,d2        * dest x,y
  419.     moveq    #15,d3
  420.     add    windowleft(a5),d2
  421.     add    windowtop(a5),d3
  422.     move    #$c0,d6        * minterm a->d
  423.     move    #WIDTH,d4    * x-size
  424.     move    #HEIGHT,d5    * y-size
  425.     lore    GFX,BltBitMapRastPort    * Zwoosh!
  426.     rts
  427.  
  428. *** Quarascope routine for Protracker
  429.  
  430. * This (and the stereoscope) are very unoptimized. The reason for this is
  431. * that unoptimized code is usually easier to understand than optimized code.
  432. * Also this leaves a certain challenge for coders to try to get the loop
  433. * as fast as possible.
  434.  
  435. quadrascope
  436.     move.l    port(a5),a3
  437.     move.l    hip_PTch1(a3),a3    * Channel 1 data
  438.     move.l    draw1(a5),a0        
  439.     bsr.b    .scope
  440.  
  441. * WIDTH/8/4 = 10
  442.  
  443.     move.l    port(a5),a3
  444.     move.l    hip_PTch2(a3),a3
  445.     move.l    draw1(a5),a0
  446.     lea    10(a0),a0        * Position
  447.     bsr.b    .scope
  448.  
  449.     move.l    port(a5),a3
  450.     move.l    hip_PTch3(a3),a3
  451.     move.l    draw1(a5),a0
  452.     lea    10+10(a0),a0
  453.     bsr.b    .scope
  454.  
  455.     move.l    port(a5),a3
  456.     move.l    hip_PTch4(a3),a3
  457.     move.l    draw1(a5),a0
  458.     lea    10+10+10(a0),a0
  459.     bsr.b    .scope
  460.     rts
  461.  
  462. .scope
  463.     tst.l    PTch_loopstart(a3)    * Always check these to avoid
  464.     beq.b    .halt            * enforcer hits!
  465.     move.l    PTch_start(a3),d0
  466.     bne.b    .jolt
  467. .halt    rts
  468.  
  469. .jolt    
  470.     move.l    d0,a1                * Sample start
  471.     moveq    #0,d5
  472.     move    PTch_length(a3),d5        * Sample length in words
  473.     add.l    d5,d5                * Convert to bytes
  474.  
  475.     move.l    port(a5),a2        * Get mainvolume
  476.     moveq    #0,d1
  477.     move.b    hip_mainvolume(a2),d1    * (Main volume * sample volume)/64
  478.     mulu    PTch_volume(a3),d1    
  479.     lsr    #6,d1            * Value for scaling the data
  480.  
  481.     moveq    #0,d0            * X coordinate
  482.     moveq    #80-1,d7        * Loop counter, do 80 pixels
  483. drlo    
  484.     move.b    (a1)+,d2        * Read one byte sample data
  485.     ext    d2            * Sign extend to word
  486.     muls    d1,d2            * Scale according to volume
  487.     asr    #6,d2            * ...
  488.     add    #$80,d2            * Change the sign
  489.     asr    #2,d2            * Scale down to 0-63
  490.     mulu    #WIDTH/8,d2        * Get Y coordinate in the bitplane
  491.  
  492.     move    d0,d4            * X
  493.     move    d0,d3
  494.     lsr    #3,d4            * X offset in bytes = x-coord/8
  495.     add    d4,d2            * Add to Y
  496.     not    d3            * Plot pixel
  497.     bset    d3,(a0,d2)        * ...
  498.  
  499.     subq    #1,d5            * Subtract sample length
  500.     bpl.b    .l            * sample end?
  501.     moveq    #0,d5            * Get values for loop 
  502.     move    PTch_replen(a3),d5    
  503.     add.l    d5,d5
  504.     move.l    PTch_loopstart(a3),a1
  505. .l
  506.     addq    #1,d0        * Increase X
  507.  
  508.     dbf    d7,drlo        * Loop..
  509.     rts
  510.  
  511.  
  512.  
  513. *** Stereoscope for PS3M
  514.  
  515. multiscope
  516.     move.l    port(a5),a1
  517.     move.l    hip_ps3mleft(a1),a1
  518.     move.l    draw1(a5),a0
  519.     bsr.b    .h
  520.  
  521.     move.l    port(a5),a1
  522.     move.l    hip_ps3mright(a1),a1
  523.     move.l    draw1(a5),a0
  524.     lea    WIDTH/8/2(a0),a0
  525.     bsr.b    .h
  526.     rts
  527.  
  528. .h    move.l    port(a5),a2
  529.     move.l    hip_ps3moffs(a2),d5        * Get offset in buffers
  530.     move.l    hip_ps3mmaxoffs(a2),d4        * Get max offset
  531.         
  532.     move    #160-1,d7        * Draw 160 pixels
  533.     moveq    #0,d0            * X coord
  534. .drlo    
  535.     moveq    #0,d2
  536.     move.b    (a1,d5.l),d2        * Get data from mixing buffer
  537.     add.b    #$80,d2
  538.     lsr    #2,d2
  539.     mulu    #WIDTH/8,d2        * Y
  540.  
  541.     move    d0,d6
  542.     move    d0,d3
  543.     lsr    #3,d6            * X offset in bytes = x-coord/8
  544.     add    d6,d2            
  545.     not    d3            * Plot pixel
  546.     bset    d3,(a0,d2)        * ...
  547.  
  548.     addq    #1,d0            * Increase x coord
  549.     addq.l    #1,d5            * Increase buffer position
  550.     and.l    d4,d5            * make sure it stays in the buffer
  551.  
  552.     dbf    d7,.drlo        * Loop
  553.     rts
  554.  
  555.  
  556.  
  557. *******************************************************************************
  558. * Window
  559.  
  560. wflags     = WFLG_SMART_REFRESH!WFLG_DRAGBAR!WFLG_CLOSEGADGET!WFLG_DEPTHGADGET
  561. idcmpflags = IDCMP_CLOSEWINDOW
  562.  
  563. winstruc
  564.     dc    110,85    * x,y position
  565. winsiz    dc    340,85    * x,y size
  566.     dc.b    2,1    
  567.     dc.l    idcmpflags
  568.     dc.l    wflags
  569.     dc.l    0
  570.     dc.l    0    
  571.     dc.l    .t    * title
  572.     dc.l    0
  573.     dc.l    0    
  574.     dc    0,640    * min/max x
  575.     dc    0,256    * min/max y
  576.     dc    WBENCHSCREEN
  577.     dc.l    0
  578.  
  579. .t    dc.b    "HiP - Example scope",0
  580.  
  581. intuiname    dc.b    "intuition.library",0
  582. gfxname        dc.b    "graphics.library",0
  583. dosname        dc.b    "dos.library",0
  584. portname    dc.b    "HiP-Port",0
  585.  even
  586.  
  587.  
  588.      section    udnm,bss_p
  589.  
  590. * Variables
  591.  
  592. var_b        ds.b    size_var
  593.  
  594.     section    hihi,bss_c
  595.  
  596. * GFX buffers
  597.  
  598. buffer1    ds.b    WIDTH/8*HEIGHT
  599. buffer2    ds.b    WIDTH/8*HEIGHT
  600.  
  601.  end
  602.